{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import warnings\n",
    "\n",
    "warnings.filterwarnings(\"ignore\")"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 蛋白质功能与结构设计简介\n",
    "*Copyright (c) 2022 Institute for Quantum Computing, Baidu Inc. All Rights Reserved.*\n",
    "\n",
    "蛋白质是生物体中重要的结构和功能分子，它们通过组装氨基酸形成长链，并通过氨基酸链的空间结构来实现特定的功能。蛋白质的空间结构指的是氨基酸链在三维空间中的构型。这种构型可以通过X射线衍射、核磁共振或其它方法测定。研究表明，蛋白质的空间结构与其功能密切相关。例如，酶作为一类重要的蛋白质，其空间结构决定了其与底物的相互作用，从而实现了化学反应的催化作用。此外，蛋白质的空间结构还可以通过改变氨基酸序列来控制其功能。\n",
    "\n",
    "蛋白质在不同的折叠方式下会产生不同的空间结构，因此研究蛋白质折叠对于研究蛋白质功能有重要意义。由于蛋白质的结构和功能问题具有高度的复杂性和非线性性，目前用经典计算求解蛋白质折叠问题的效率很低。量子计算可以通过量子力学原理来快速求解复杂的非线性优化问题，普遍认为将会在未来对蛋白质折叠方面的研究起到极大的帮助。"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 利用量子计算方法模拟蛋白质折叠过程\n",
    "### 晶格模型\n",
    "在蛋白质结构研究中，一种常用的方法是晶格模型\\[1\\]，它将蛋白质中的氨基酸链划分为一系列晶格单元，每个晶格单元包括若干个氨基酸。通过对晶格单元之间相互作用的分析，我们可以推测出蛋白质的空间结构。晶格模型可以帮助我们更好地理解蛋白质的结构与功能，为药物设计和治疗疾病提供重要的理论依据。\n",
    "![](lattice_model_demo.jpg)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Protein with 7 nodes and 6 edges\n"
     ]
    }
   ],
   "source": [
    "from paddle_quantum.biocomputing import Protein\n",
    "\n",
    "protein = Protein(\"APRLRFY\")\n",
    "print(protein)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "利用 `paddle_quantum` 的 `biocomputing` 模块， 我们可以很容易地完成一个蛋白质的构建，上面的代码就构造了一个包含7个氨基酸的氨基酸链。\n",
    "\n",
    "从晶格模型出发，我们可以根据格点之间的相互作用得到一个蛋白质的哈密顿量\\[2\\]，我们可以基于这个哈密顿量构造变分量子算法（VQE）来求解蛋白质分子的稳定结构（能量最低时的结构）。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 其中 lambda0 和 lambda1 是蛋白质哈密顿量中的两个参数，用于约束蛋白质的空间结构。\n",
    "h = protein.get_protein_hamiltonian(lambda0=10.0, lambda1=10.0)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 变分量子线路\n",
    "用户可以使用变分量子算法（VQE）来解决蛋白质折叠问题。这个问题中的变分量子线路如下。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 494x220 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from folding_protein import circuit\n",
    "\n",
    "# 下面的代码搭建了一个宽度为4，包含两个线路单元的参数化量子线路（注：一个线路单元包含一层RY和一层CNOT）。\n",
    "cir = circuit(4, 2)\n",
    "cir.plot()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 如何使用\n",
    "用户可以通过编辑配置文件config.toml对任务进行自定义，其中用户可以设置的参数如下\n",
    "```toml\n",
    "# The configuration file for protein folding problem\n",
    "\n",
    "# The amino acides consists in protein. \n",
    "amino_acids = [\"A\", \"P\", \"R\", \"L\", \"R\", \"F\", \"Y\"]\n",
    "# Pair of indices indicates the potentially interact amino acide pair.\n",
    "possible_contactions = [[0, 5], [1, 6]]\n",
    "# Depth of the quantum circuit used in VQE\n",
    "depth = 1\n",
    "# Number of VQE iterations\n",
    "num_iterations = 200\n",
    "# The condition for VQE convergence\n",
    "tol = 1e-3\n",
    "# The number of steps between two consecutive loss records\n",
    "save_every = 10\n",
    "# learning rate for the optimizer\n",
    "learning_rate = 0.5\n",
    "```\n",
    "用户可以在命令行中运行\n",
    "```shell\n",
    "python folding_protein.py --config config.toml\n",
    "```\n",
    "来得到上面氨基酸序列在空间中折叠的三维结构，程序会自动保存这个空间结构的图片。\n",
    "\n",
    "![](APRLRFY_3d_structure.jpg)\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 参考文献\n",
    "\\[1\\] Pande, Vijay S., and Daniel S. Rokhsar. \"Folding pathway of a lattice model for proteins.\" Proceedings of the National Academy of Sciences 96.4 (1999): 1273-1278.\n",
    "\n",
    "\\[2\\] Robert, Anton, et al. \"Resource-efficient quantum algorithm for protein folding.\" npj Quantum Information 7.1 (2021): 1-5."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "modellib",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.15"
  },
  "orig_nbformat": 4,
  "vscode": {
   "interpreter": {
    "hash": "8f24120f890011f53feb4ed62c47961d8565ec1de8b7cb23548c15bd6da8f2d2"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
